home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / comm / comm1 / klrkcmsr.lha / Comment_Stats.C < prev    next >
C/C++ Source or Header  |  1995-12-25  |  7KB  |  196 lines

  1. #define COMMENT_STATS
  2.  
  3. #include "Comment.H"
  4.  
  5. void Commentistics ( void )
  6. {
  7.     char    temp[ 300 ] , perc[ 21 ], overall[15], time[ 40 ];
  8.     struct Node *node;
  9.     int    i, j, lines_on_screen = 4, max_lines;
  10.     long    total_messages = 0;
  11.     FILE    *fptr;
  12.     struct USER usr;
  13.     BOOL    double_space = FALSE;
  14.  
  15.     for ( node = (struct Node *) KC_Users0List.mlh_Head ; node->ln_Succ; node = node->ln_Succ )
  16.     {
  17.         rc_node = (struct receiver_node *) node;            
  18.         total_messages += rc_node->rc_msg_received;
  19.     }
  20.  
  21.     if ( total_messages == 0 )
  22.     {
  23.         sm( " No messages have been written yet. Nothing to show.\n\r" , 0 );
  24.         enddoor ( EXIT_SILENTLY );
  25.     }
  26.  
  27.     // First, clear the screen and set cursor in upper left corner
  28.     sm( CLS , 0 );
  29.  
  30.     // How may space does the header take up (in lines)?
  31.     lines_on_screen += DisplayHeader( 3 );
  32.  
  33.     sm( ".----------------------------------------------------------------------------.\n\r" , 0 );
  34.     sm( "| KiLLER COMMENT v1.4  ^  <X>   COMMENTiSTiCS   <X>  ^  (c) KiLLraVeN/MYSTiC |\n\r" , 0 );
  35.     sm( "`----------------------------------------------------------------------------'\n\r" , 0 );
  36.     sm( ".----------------------.----------------------.-------.-------.--------------.\n\r" , 0 );
  37.     sm( "| User Name            0%--------------100% Total Perc% Overall      |\n\r" , 0 );
  38.     sm( ":----------------------:----------------------:-------:-------:--------------:\n\r" , 0 );
  39.  
  40.     // How many lines can there be at the most?
  41.     getuserstring( temp , DT_LINELENGTH );
  42.     max_lines = atoi( temp );
  43.  
  44.     // Make up for the lost line while displaying header (why? don't know)
  45.     if ( gn_ptr->gn_header[ 0 ] != 0x00 )
  46.         lines_on_screen += 1;
  47.  
  48.     // Do we use two lines per receiver or not?
  49.     if ( lines_on_screen + ( gn_ptr->gn_total_users * 2 ) + 3 <= max_lines )
  50.         double_space = TRUE;
  51.  
  52.     for ( node = (struct Node *) KC_Users0List.mlh_Head ; node->ln_Succ; node = node->ln_Succ )
  53.     {
  54.         rc_node = (struct receiver_node *) node;            
  55.         strcpy( perc , "####################" );
  56.         if ( rc_node->rc_msg_received != 0 )
  57.         {
  58.             i = ( ( rc_node->rc_msg_received * 100 ) / total_messages );
  59.               j = i / 5 ;
  60.  
  61.             // The sysop's bar displays his part of the total number of
  62.             // messages written. So if there are 200 messages written in
  63.             // total and 100 of them are to the sysop, his bar will be
  64.             // filled for 50%. The rest of 100 messages is relatively
  65.             // divided between the cosysops.
  66.             //
  67.             // This means it *IS* possible for a cosysop to have a bigger
  68.             // bar than the sysop.
  69.             if ( (struct Node *) rc_node->nn_Node.ln_Pred == (struct Node *) &KC_Users0List.mlh_Head )
  70.                 total_messages -= rc_node->rc_msg_received;
  71.         }
  72.         else
  73.         {
  74.             i = 0;
  75.             j = 0;
  76.         }
  77.  
  78.         perc[ j ] = 0x00;
  79.  
  80.         if ( rc_node->rc_msg_received <= 5 )
  81.             strcpy( overall, "Loser" );
  82.         else
  83.             if ( rc_node->rc_msg_received < 50 )
  84.                 strcpy( overall , "That's it?" );
  85.             else
  86.                 if ( rc_node->rc_msg_received < 100 )
  87.                     strcpy( overall , "Just begun" );
  88.                 else
  89.                     if ( rc_node->rc_msg_received < 250 )
  90.                         strcpy( overall , "Some day..." );
  91.                     else
  92.                         if ( rc_node->rc_msg_received < 500 )
  93.                             strcpy( overall , "OK dude" );
  94.                         else
  95.                             if ( rc_node->rc_msg_received < 1000 )
  96.                                 strcpy( overall , "Macho man" );
  97.                             else
  98.                                 if ( rc_node->rc_msg_received < 2000 )
  99.                                     strcpy( overall , "Tough guy!" );
  100.                                 else
  101.                                     if ( rc_node->rc_msg_received >= 2000 )
  102.                                         strcpy( overall , "Ruler!" );
  103.  
  104.         if ( rc_node->rc_number == 1 )
  105.             sprintf( temp , "| %-20.20s %-20.20s %5d |  %3d% %-12s |\n\r" , rc_node->rc_knownas , perc , rc_node->rc_msg_received , i , overall );
  106.         else
  107.             sprintf( temp , "| %-20.20s %-20.20s %5d |  %3d% %-12s |\n\r" , rc_node->rc_knownas , perc , rc_node->rc_msg_received , i , overall );
  108.         sm( temp , 0 );
  109.  
  110.         if (     double_space &&
  111.                 rc_node->rc_number < gn_ptr->gn_total_users )
  112.             sm(":----------------------:----------------------:-------:-------:--------------:\n\r" , 0 );
  113.     }
  114.  
  115.     // Don't forget to add the sysop's amount of messages to the total
  116.     // again.
  117.     rc_node = (struct receiver_node *) KC_Users0List.mlh_Head;
  118.     total_messages += rc_node->rc_msg_received;
  119.  
  120.     sm( ":----------------------^----------------------^-------^-------^--------------:\n\r" , 0 );
  121.     sprintf( temp , "| Total messages: %6ld Average: %6ld msgs per user [Q]uit / Any key  |\n\r" , total_messages , total_messages/gn_ptr->gn_total_users );
  122.     sm( temp , 0 );
  123.     sm( "`----------------------------------------------------------------------------'AD" , 0 );
  124.  
  125.     hk ( "" , temp );
  126.     switch ( temp[ 0 ] )
  127.     {
  128.         case 'q'    :
  129.         case 'Q'    :
  130.         case 0x1B:
  131.         case  3     :    sm( "B" , 0 );
  132.                         enddoor( EXIT_SILENTLY );
  133.     }
  134.  
  135.     // Clear the screen in a fancy way
  136.     sm( "\n\r" , 0 );
  137.     if ( double_space )
  138.         j = 4 + ( 2 * gn_ptr->gn_total_users );
  139.     else
  140.         j = 5 + gn_ptr->gn_total_users;
  141.     for ( i = 1 ; i <= j ; i ++ )
  142.         sm( "                                                                              \n\rA" , 0 );
  143.  
  144.     // Built the header of the second screen
  145.     sm( ".------------------------.--------------------------.------------------------.\n\r" , 0 );
  146.     sm( "| User Name              Date/Time of last msg    Last msg came from     |\n\r" , 0 );
  147.     sm( ":------------------------:--------------------------:------------------------:\n\r" , 0 );
  148.  
  149.     // Open the USER.DATA for retrieval of user names
  150.     sprintf( temp, "%s" , bbs_location );
  151.     AddPart( temp, "USER.DATA" , 200 );
  152.     if ( fptr = fopen ( temp , "r" ) )
  153.     {
  154.         for ( node = (struct Node *) KC_Users0List.mlh_Head ; node->ln_Succ; node = node->ln_Succ )
  155.         {
  156.             rc_node = (struct receiver_node *) node;            
  157.  
  158.             // What's the time?
  159.             // It's got no use to time 0, so filter that one out
  160.             if ( rc_node->rc_last_msg != 0 )
  161.             {
  162.                 sprintf( time , ctime( &rc_node->rc_last_msg ) );
  163.                 time[ strlen(time) - 1 ] = 0x00;
  164.             }
  165.             else
  166.                 sprintf( time , "None" );
  167.  
  168.             // Retrieving the name of the last message sender
  169.             // Make sure we don't try seeking user 0 (no messages received)
  170.             // or we will get an error (boom crash failure! :) ).
  171.             if ( rc_node->rc_last_user != 0 )
  172.             {
  173.                 if ( fseek ( fptr , ( rc_node->rc_last_user - 1 ) * sizeof ( struct USER ) , SEEK_SET ) == -1 )
  174.                 {
  175.                     sm( "Error reading USER.DATA file for user's name. Stopping output.\n\r" , 0);
  176.                     fclose( fptr );
  177.                     break;
  178.                 }
  179.                 fread ( &usr , 1 , sizeof( struct USER ) , fptr );
  180.             }
  181.             else
  182.                 sprintf( usr.Name , "None" );
  183.  
  184.             // Put the lot on screen
  185.             sprintf( temp , "| %-22.22s %-24.24s %-22.22s |\n\r" , rc_node->rc_knownas , time , usr.Name );
  186.             sm( temp , 0 );
  187.             if (     double_space &&
  188.                     rc_node->rc_number < gn_ptr->gn_total_users )
  189.                 sm(":------------------------:--------------------------:------------------------:\n\r" , 0 );
  190.         }
  191.         sm( "`------------------------^--------------------------^------------------------'\n\r" , 0 );
  192.         fclose( fptr );
  193.     }
  194.     enddoor( EXIT_SILENTLY );
  195. }
  196.